package algorithm.hashtable;

import java.util.*;

/**
 * leetcode : https://leetcode.com/problems/group-anagrams/description/
 * Difficulty : Medium
 *
 * 给一个字符串数组，将相同变位词归类为一组。
 * 所有输入都是小写，输出顺序无所谓
 *
 * 举栗：
 * Input: ["eat", "tea", "tan", "ate", "nat", "bat"]
 * Output:
 * [
 * ["ate","eat","tea"],
 * ["nat","tan"],
 * ["bat"]
 * ]
 *
 * 思路：
 * 用hash表,相同字母的映射到相同hash，即可归类
 * @Author Antony
 * @Since 2018/7/25 19:03
 */
public class GroupAnagrams {

    public static void main(String[] args) {
        String s = "cbdea";
        char[] sChar = s.toCharArray();
        Arrays.sort(sChar);
        System.out.println(sChar);
    }

    /**
     * beats 95.22% - 15ms
     * 把String的字符 sort排列后，就是唯一的字符，根据这个进行hash映射，即可
     */
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<>();
        for(String str : strs){
            char[] charArray = str.toCharArray();
            Arrays.sort(charArray);
            String key = new String(charArray);
            List<String> list = map.get(key);
            if(list == null){
                list = new ArrayList<>();
            }
            list.add(str);
            map.put(key, list);

        }

        return new ArrayList<>(map.values());
    }
}
